package com.yunlongn.common.core.processor;
//
//import org.springframework.beans.BeansException;
//import org.springframework.beans.factory.config.BeanPostProcessor;
//import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
//import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor;
//import org.springframework.beans.factory.support.RootBeanDefinition;
//import org.springframework.boot.context.event.ApplicationReadyEvent;
//import org.springframework.context.ApplicationListener;
//import org.springframework.core.PriorityOrdered;
//import org.springframework.stereotype.Component;
//
//import java.util.Comparator;
//import java.util.HashMap;
//import java.util.HashSet;
//import java.util.Map;
//import java.util.Set;
//import java.util.concurrent.atomic.AtomicInteger;
//import java.util.stream.Collectors;
//
//@Component
//public class LoggerBeanLoadCostPostProcessor implements InstantiationAwareBeanPostProcessor, PriorityOrdered, ApplicationListener<ApplicationReadyEvent> {
//
//
//    private static Map<String, BeanEn> cost = new HashMap<>(10000);
//    private static Set<BeanEn> beanEnList = new HashSet<>();
//
//    private static AtomicInteger beanCount = new AtomicInteger(0);
//
//    @Override
//    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
//        if (!Thread.currentThread().getStackTrace()[7].getMethodName().equals("doGetBean")) {
//            return null;
//        }
//        BeanEn beanEn = new BeanEn();
//        beanEn.setCost(0);
//        beanEn.setStartTime(System.currentTimeMillis());
//        beanEn.setName(beanName);
//
//        if(cost.get(beanName) == null){
//            beanEnList.add(beanEn);
//            cost.put(beanName, beanEn);
//        } else {
////            throw new RuntimeException();
//        }
//        return null;
//    }
//
//    @Override
//    public int getOrder() {
//        return -999;
//    }
//
//
//    @Component
//    public class LoggerBeanLoadCostEndPostProcessor implements BeanPostProcessor, MergedBeanDefinitionPostProcessor {
//
//        @Override
//        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//            if (!Thread.currentThread().getStackTrace()[8].getMethodName().equals("doGetBean")) {
//                return bean;
//            }
//            beanCount.incrementAndGet();
//            if(cost.get(beanName) != null){
//                BeanEn beanEn = cost.get(beanName);
//                beanEn.setCost(System.currentTimeMillis() - beanEn.getStartTime());
//                beanEnList.add(beanEn);
//                cost.remove(beanName);
//                System.out.println("" + beanEn.getName() + " " + beanEn.getCost());
//            }else{
////                logger.error("error beanname = {} ", beanName);
//            }
//
//            return bean;
//        }
//
//        @Override
//        public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
//
//        }
//    }
//
//    @Override
//    public void onApplicationEvent(ApplicationReadyEvent event) {
//        final Long reduce = beanEnList.stream().map(BeanEn::getCost).reduce(0L, Long::sum);
//        System.out.println("bean init total => " + reduce);
//        System.out.println("bean beanCount => " + beanCount.get());
//        beanEnList.stream().sorted(Comparator.comparing(BeanEn::getCost).reversed()).collect(Collectors.toList()).forEach(beanEn -> {
//            System.out.println("" + beanEn.getName() + " " + beanEn.getCost());
//        });
//    }
//
//    @Data
//    public class BeanEn extends Object{
//        private long cost;
//        private String name;
//        private long startTime;
//        @Override
//        public boolean equals(Object obj) {
//            if (obj instanceof BeanEn) {
//                return this.getName().equals(((BeanEn) obj).getName());
//            } else {
//                return false;
//            }
//        }
//    }
//
//}
